package Upload;

import Utils.*;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.WebServiceRef;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import Webservices.DocumentServiceService;
import Webservices.IOException_Exception;
import Webservices.ParserConfigurationException_Exception;
import Webservices.SAXException_Exception;

/**
 * Servlet pour déposer un document XML.
 * @author Valentin & David.
 */
public class FileUploadServlet extends HttpServlet {
    @WebServiceRef(wsdlLocation = "WEB-INF/wsdl/DocumentServiceService.wsdl")
    private DocumentServiceService service;
    
    /**
     * Fonction pour récupérer (POST) les paramètres de la page web.
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        int result = 0;
        if(ServletFileUpload.isMultipartContent(request)){
            try {
                List<FileItem> multiparts = new ServletFileUpload(
                        new DiskFileItemFactory()).parseRequest(request);
                
                for(FileItem item : multiparts){
                    if(!item.isFormField()){
                        // On récupère le nom du fichier.
                        String name = new File(item.getName()).getName();
                        File leFichier =  new File(name);
                        // On l'enregistre sur le serveur (du client).
                        item.write(leFichier);
                        
                        // On convertie notre fichier en tableau de Bytes.
                        byte[] tabByte = Commons.convertirFile2Bytes(leFichier);
                        
                        // On fait appel au WS.
                        result = this.depotDocument(tabByte);
                    }
                }
                //L'upload a reussie.
                request.setAttribute("message", "Le fichier XML a correctement été téléchargé. "
                        + "Votre document porte l'identifiant : "+result);
            } catch (Exception ex) {
                request.setAttribute("message", "Problème durant le téléchargement : " + ex);
            }
        }else{
            request.setAttribute("message",
                    "Sorry this Servlet only handles file upload request");
        }
        // On redirige vers la page resultDeposerXML.jsp
        request.getRequestDispatcher("/resultDeposerXML.jsp").forward(request, response);
    }
    
    /**
     * Fonction du web service.
     * @param arg0 : Tableau de Bytes correspondant au fichier XML.
     * @return
     * @throws IOException_Exception
     * @throws ParserConfigurationException_Exception
     * @throws SAXException_Exception
     */
    private int depotDocument(byte[] arg0) throws IOException_Exception, ParserConfigurationException_Exception, SAXException_Exception {
        Webservices.DocumentService port = service.getDocumentServicePort();
        return port.depotDocument(arg0);
    }
}